package com.hex.ds.hdtp.core.inf.metadata.service;

import com.hex.ds.hdtp.core.inf.metadata.entity.TableFieldsEntity;
import com.hex.ds.hdtp.core.inf.metadata.po.SourceConfInfoPo;

import java.util.List;

/**
 * @Package: com.hex.ds.hdtp.core.inf.metadata.service
 * @ClassName ISourceMethodService
 * @Description: 数据元操作
 * @Author: wz.li
 * @Date 2023/8/28 14:23
 * @Version v2.0.2
 **/
public interface ISourceMethodService {

    /*
     * @Method: connection <br>
     * @Param: [sourceConfInfoList] <br>
     * @Return: java.lang.Boolean <br>
     * @Description：测试连接<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:23 <br>
     * @Version： V2.0.2<br>
     */
    Boolean connection(List<SourceConfInfoPo> sourceConfInfoList);

    /*
     * @Method: schemas <br>
     * @Param: [sourceCode] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：获取指定数据源的库集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:24 <br>
     * @Version： V2.0.2<br>
     */
    List<String> schemas(String sourceCode);

    /*
     * @Method: tables <br>
     * @Param: [sourceCode, schemaName] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：获取指定数据源和库的表集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:24 <br>
     * @Version： V2.0.2<br>
     */
    List<String> tables(String sourceCode, String schemaName);

    /*
     * @Method: procedures <br>
     * @Param: [sourceCode, schemaName] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：获取指定数据源和库的存储过程集合<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:24 <br>
     * @Version： V2.0.2<br>
     */
    List<String> procedures(String sourceCode, String schemaName);

    /*
     * @Method: proceduresContent <br>
     * @Param: [sourceCode, schemaName, proceduresName] <br>
     * @Return: java.lang.String <br>
     * @Description：获取指定存储过程的内容<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:25 <br>
     * @Version： V2.0.2<br>
     */
    String proceduresContent(String sourceCode, String schemaName, String proceduresName);

    /*
     * @Method: proceduresContent <br>
     * @Param: [sourceCode, schemaName, proceduresName] <br>
     * @Return: java.lang.String <br>
     * @Description：获取指定数据源和库、表的元数据<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:24 <br>
     * @Version： V2.0.2<br>
     */
    List<TableFieldsEntity> tableStructure(String sourceCode, String schemaName, String tableName);

    /**
     * @Method tableStructureByType
     * @Param
     * @Param sourceCode
     * @Param schemaName
     * @Param tableName
     * @Return java.util.List<com.hex.ds.hdtp.core.inf.metadata.entity.TableFieldsEntity>
     * @Description 获取指定类型数据源和库、表的元数据
     * @Author xin.zhao
     * @Date 2023/12/8 16:26
     * @Version V1.0
     */
    List<TableFieldsEntity> tableStructureByType(String sourceCode, String schemaName, String tableName, String fieldType);

    /*
     * @Method: executeUpdatetSql <br>
     * @Param: [sourceCode, updateSql] <br>
     * @Return: void <br>
     * @Description：执行指定SQL<br>
     * @Author： wz.li<br>
     * @Date： 2023/8/28 14:25 <br>
     * @Version： V2.0.2<br>
     */
    void executeUpdatetSql(String sourceCode, String updateSql);

    /**
     * 获取数据库Schemas的SQL
     *
     * @return
     */
    String getSchemasSql();

    /**
     * 获取数据库Tables的SQL
     *
     * @param schemaName
     * @return
     */
    String getTablesSql(String schemaName);

    /**
     * 获取表的数据量SQL
     *
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableDataNumSql(String schema, String table, String whereSql);

    /**
     * 获取表是否有数据SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableIsHaveDataSql(String schema, String table);

    /**
     * 获取全字段明细对比SQL
     *
     * @param fields
     * @param schema
     * @param table
     * @param partitionsWhereSql
     * @param sortField
     * @return
     */
    String getTableAllFieldSql(String fields, String schema, String table, String partitionsWhereSql, String sortField);

    /**
     * 获取分批比对全字段明细对比的SQL
     *
     * @param fields
     * @param schema
     * @param table
     * @param whereSql
     * @param extractScope
     * @param offset
     * @param sortField
     * @return
     */
    String getTableAllFieldSqlLimitSql(String fields, String schema, String table, String whereSql, Long extractScope, Long offset, String sortField);

    /**
     * 获取字段为空总数SQL
     *
     * @param schema
     * @param table
     * @param field
     * @param whereSql
     * @return
     */
    String getTableIsNullCountSql(String schema, String table, String field, String whereSql);

    /**
     * 获取去重COUNT的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableDistinctCountSql(String field, String schema, String table, String whereSql);

    /**
     * 获取分组COUNT的SQL
     *
     * @param schema
     * @param table
     * @param field
     * @param whereSql
     * @return
     */
    String getTableGroupCountSql(String schema, String table, String field, String whereSql);

    /**
     * 获取字段COUNT的SQL
     *
     * @param schema
     * @param table
     * @param field
     * @param whereSql
     * @return
     */
    String getTableFieldGroupCountSql(String schema, String table, String field, String whereSql);

    /**
     * 获取字段TRIM的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableFieldTrimSql(String field, String schema, String table, String whereSql);

    /**
     * 获取字段SUM的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableFieldSumSql(String field, String schema, String table, String whereSql);


    /**
     * 获取字段长度MAX的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableLengthMaxSql(String field, String schema, String table, String whereSql);

    /**
     * 获取指定字段长度TRIM后SUM的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableFieldLengthSumTrimSql(String field, String schema, String table, String whereSql);


    /**
     * 获取指定字段字段长度SUM的SQL
     *
     * @param field
     * @param schema
     * @param table
     * @param whereSql
     * @return
     */
    String getTableFieldLengthSumSql(String field, String schema, String table, String whereSql);

    /**
     * 获取所有字段总数SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableAllFieldNumSql(String schema, String table);


    /**
     * 获取所有字段名称SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableAllFieldNameSql(String schema, String table);

    /**
     * 获取所有字段长度SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableAllFieldLengthSql(String schema, String table);


    /**
     * 获取字段精度SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableFieldAccuracySql(String schema, String table);

    /**
     * 获取字段类型SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableAllFieldTypeSql(String schema, String table);

    /**
     * 获取分区字段的SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTablePartitionFieldSql(String schema, String table);

    /**
     * 获取查询表建表语句的SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getTableShowCreateTableSql(String schema, String table);

    /**
     * 获取创建表时头部分SQL
     *
     * @param schema
     * @param table
     * @return
     */
    String getCreateTableHeaderSql(String schema, String table);

    /**
     * 获取字符数据类型
     *
     * @return
     */
    List<String> getStrDataType();

    /**
     * 获取数值数据类型
     *
     * @return
     */
    List<String> getNumDataType();

    /**
     * 获取精度数据类型
     *
     * @return
     */
    List<String> getAccuracyDataType();
}
